ドキュメント(DocumentApp)
body.appendTable([
['Cell 1', 'Cell 2'],
['Cell 3', 'Cell 4']
]);
|
まだ、不完全で、エレメントの下に入れたい。
1つは「ツール」「スクリプトエディタ」で直接「実行」するスクリプト。2つ目はメニューバーに追加するスクリプト。3つ目は「アドオン」に加えるアドオン。
一時的に必要な処理は「ツール」「スクリプトエディタ」で直接「実行」する。また、「トリガ」によって実行することが出来る。onOpen()関数は、ドキュメントが開かれたときに呼び出される。onOpen()関数は、メニューやアドオンの設定にも使用できる。
ドキュメントを開いたときに実行されるonOpen()関数でメニューを作って追加する。
|
メニューバーに「図表番号」が追加され、そのサブメニューに「図番」「表番」「振り直し」が追加され、それぞれ FigureTitle()、TableTitle()、Renumber() を呼び出す。
「アドオン」は、公開されたものが対象のようで、「アドオンの管理」には「ツール」「スクリプトエディタ」で作成したものは現れない。
|
しかし、「アドオン」メニューに加えることは出来て使用できる。onOpen()関数で追加するものなので、これがなければ削除になる。問題なのはメニューに追加される名前がプロジェクト名になること。
「ツール」「スクリプトエディタ」でエディタを開くと自動的に「無題のプロジェクト」が作成され、ドキュメントはそのコンテナとなる。管理上、プロジェクト名はドキュメントの名前と一致させたいが、これがアドオンのメニューに出てくる名前となる。
見た限りでは「アドオン」はUIを持ったアプリケーションで、「サイドバー」と呼ばれている。画面の右にテキストエリアやボタンがある帯が表示される。これはHTMLでデザインする。例では sidebar(.html) を作成している。Apps Scriptアプリケーションと同じ。google.script.run を使ってサーバサイドスクリプトを呼び出せる。
「アドオン」メニューに追加される選択肢(名前)は、自動的にプロジェクト名になる。アドオンを複数作成し、それぞれのプロジェクトからスクリプトIDをコピーする。ドキュメントを作成し、「ツール」「スクリプトエディタ」とするとエディタが開いて「無題のプロジェクト」となる。ここに onOpen()を書いて、アドオンを設定する。先に、「ライブラリ+」で複数のアドオンを追加する。ライブラリのID欄に追加されるのはそれぞれのアドオンのプロジェクト名となる。
onOpen()では、「このアドオンのプロジェクト名」.onOpen(); と書いて、それぞれ初期化する。
しかし、メニューには1つしか追加されない。名前はアドオンのプロジェクトではなく、すべてドキュメントを含んだプロジェクトの名前(無題のプロジェクト)になってしまう。同名の場合追加されず、最後に追加した1つのアドオンだけが使えるようだ。 ここで行なった方法は、公開されているアドオンの追加とは異なる。別のインストール方法があるのかも知れないが分からない。 可能な方法として、ドキュメントに付随した onOpen() を以下のように書くことはできる。 |
|
アドオンとして、SourceCodePane と CodePane と言う2つのプロジェクトを作成した。これをドキュメントのエディタでライブラリに追加した。複数の自作のアドオンを使うことはできる。
ライブラリの追加に必要なのはスクリプトIDで、一意のプロジェクトの識別子で、プロジェクトと同じ寿命のコード(不変)と考えて良いようだ。
しかし、ドキュメントを作成する際の補助となるツールを作る方法としては不完全です。ドキュメントを作成する場合に必ずスクリプトエディタを起動してプロジェクト化することになります。また、必ずスクリプトを書く必要があります。ファイル作成やスクリプトのコピーより作業が少ないことだけがメリットです。
アドオンのモデルはUIを持ち、ドキュメントの選択領域を加工したものをUIに表示し、ボタン等の操作で結果をドキュメントの選択領域に反映します。例えば、選択領域を翻訳し、結果を挿入するとか、ドキュメントに貼り付けたソースコードをコードブロックらしくカラーリングして表示すると言ったものがあります。
こうしたアドオンのようなものをライブラリで使いまわそうとすると2つ問題が起きます。
|
ドキュメントの「アドオン」に項目を追加してUIを起動します。上のスクリプトがドキュメントにバインドされたスクリプトのものなら、バインドされた同じスクリプトの showSidebar() がメニューから呼び出されます。このコードがライブラリにあっても、やはりドキュメントにバインドされたスクリプトの showSidebar() が呼び出されることが最初の問題です。
|
この問題は、ライブラリとするスクリプトを含んだプロジェクト名を固定して、最初からライブラリの名前(ID欄の名前)を加えて置くことで回避できます。
2つ目の問題は、google.script.run によるサーバサイドスクリプトの実行は、ライブラリの関数を直接呼べないと言うことです。呼び出すのはUIとなるHTMLに含まれるJavaScriptです。例えば、サーバサイドスクリプトの insertText() を呼び出そうとして、CodePane. insertText() と書いても、ブラウザのインタプリタは対応しません。
現在できることは、ライブラリにするスクリプトには細工をしないで、ライブラリを使用する側でスクリプトを書くことです。
|
ライブラリを追加する際のID欄が CodePane だとして、onOpen()はドキュメントを開くたびに呼び出され、アドオンメニューに項目を追加します。メニューから選択されると showSidebar() を呼び出すように設定されているので、これを書いてライブラリの関数にリダイレクトします。insertText()は、アドオンのUIのJavaScriptから呼び出されるサーバサイドスクリプトですが、これもリダイレクトします。
メニューバーに登録して起動だけを行なうスクリプトならプロジェクト名を固定して、ライブラリとなるスクリプト内にプロジェクト名を付けて記述することにします。
いずれも複数になることは確実なので、ドキュメントには、それぞれメニューを登録するスクリプトを(ファイルとしてコピーすることができないので)カット&ペーストすることは止む追えないようです。